Looks like it's "just" type-erasure / syntactical sugar. E.g. value types are boxed.
Yes, but see the section on custom unions* - you can write non-boxing unions/generators.
* https://devblogs.microsoft.com/dotnet/csharp-15-union-types/...
Yes, but that's just the default behavior. You can implement your own non-boxing version for performance critical applications.
Right, the default boxes into heap, but unions are different. Some languages pack them as a flat struct (tag + payload, no allocation).
Here is visual layout if anyone is interested - https://vectree.io/c/memory-layout-tagging-and-payload-overl...