Well the return area is create by the caller on the stack. This is why you don't have any copy when you do :
Image i = texture.CopyToImage(); // Copy constructor isn't called here
This copy constructor isn't called because the memory are where the image is intanciated is created by the caller and passeed to the function as an hidden parameter (a pointer). So you can return a reference in this particular case.
Nevermind, this isn't a big deal.
EDIT: Well that remembers me why I do less C++ and looks for alternatives in things like D
Obviously, the area on the stack isn't create if you return by reference. My C++ is a bit rusty, you are right. keeping the original post for the reccord.