Yea, for Return, the result is constructed at every Return using the copy constructor or bitwise copy if there is none (I consider this latter part to be a bug, see also
Copy construction behaviour).
On the other hand, for Function=, the result is constructed at the top of function using the default constructor (an error will be shown by recent fbc versions if there is none) and then each Function= does an assignment, using Let operator if it exists or bitwise copy.
Also, the compiler shows an error when mixing Return and Function= in the same function in such cases where the result is a UDT with constructors.