To put it another way: Adobe can ship Photoshop using Emscripten, and big companies can probably eventually ship their internal C# business apps using Uno or Blazor, but you're not going to ship either of those using Unity's stock approach without building out all of the platform APIs they stripped out and adding back runtime features that were removed. The decisions they made were perfect for games, but people building general-purpose platforms can't cut all those corners.
However, they do not guarantee that the APIs in the .Net framework will work on all platforms, as some of them are still Windows specific.
https://docs.unity3d.com/2019.1/Documentation/Manual/dotnetP...
They do take the IL generated by Rosyln and convert it to executable code using their own custom transpiler.
The way Unity solves this is by creating their own C# dialect, compiler and minimal runtime (without GC etc). Sort of a brute-force approach, but until the standard .NET ecosystem solves the bloat problem it would have been better to build on a different language ecosystem.