Is my understanding correct that assignment by calling the latter (return by value) would leave two copies of the data some_type in memory at certain points during the application's execution, while the calling former (return by reference) avoids this?
With a modern compiler chances of that are pretty slim. The standard specifically blesses what's called return value optimization (and named return value optimization) to let a compiler avoid creating extra copies in a case like this. Every reasonably modern compiler of which I'm aware includes this optimization. In some cases (e.g., gcc) they do this optimization even when you tell the compiler not to do optimization. With optimization turned on, you'd have to look at something like 10 years (maybe more) to find a compiler that didn't do it.
C++11 adds "move" capability to do even more to ensure against the problem you're concerned with, even when you return a large object by value.
Bottom line: looks to me like what you're looking in the wrong place -- you might want to consider adding an explicit move constructor (and possibly move assignment operator) to your class, but in general, you can just return by value and be happy.