It is very unlikely that you would REALLY encounter performance issues due to returning by value. Note that NRVO that you have mentioned is just one of many things that the compiler will do to optimize your code.
Unless you have really good reason to use pointers, avoid using them. Stick to objects with automatic storage duration, follow RAII and keep your code clean. Once you create some "large" objects, be careful about the way you are passing them across your application (avoid redundant copies being created), but apart from that any additional effort spent by trying to improve the performance will most likely be just a premature optimization.
In other words: instead of thinking about "what would be the more efficient approach?" just write a code that is as correct and clean (easy to read, easy to understand) as possible -> in this case it probably means to return by value. And if you end up with solution that is not efficient enough, just then spend effort of finding out why (but in that case you'll be facing the specific problem rather than rhetorical question at least).