Go runtime is dominated by the costs of allocation and GC.
If you return 10000 persons, then if we make the (unrealistic) assumption that a Person contains not pointers (strings etc). then returning []Person would require one allocation, whereas returning []*Person would require 10,001. And GC will be much slower as there will be 10,000 more objects to mark.
Iteration across the returned slice will also be much faster in the former case, as each Person will
reside in (cache friendly) sequential memory locations, whereas in the latter case the memory location
of each person will be effectively randomised and entail a cache miss.
So in general returning []Person will be much faster.
Of course you should make sure you pre-allocate the entire slice, rather than letting it grow automatically
as the result of appends.