First of all: This issue does not matter on a PC.
But I am an original embedded developer so I should now such things.

Here my theory, please correct me if I am wrong.

In the value parameter version the string copy on the stack is generated by the calling function and the address to this copy is passed.
In the reference parameter version the caller passes the address to the original string. The string copy is done in  the called function later.

Unfortunately I cannot track these in the optimized assembler code. I think there are things like "copy on demand" going on.
But anyway, your final version produces less code. I thing this must be because the copy code is only one time in the binary instead of each time the function is called. I guess from the performance point of view both versions are almost the same because a copy must be done in any case. 

The difference is such big, because the ext4 uses 4 KiB pages. We must have a look at the map file to see the truth.