The assumption that the ideal application to ship to end users is all machine code and that anything else is bloat is an interesting one. If you look into it, it quickly becomes obvious that the machine code tends to be more bloated than the source code. That's on x86, an instruction set architecture that was designed to make the machine code as short as possible, at the expense of making the interpreter implemented in hardware more complex and less efficient. Modern alternatives to x86 care less about the compactness of the machine code.
It may actually be less bloated not to ship machine code, but instead ship an intermediate representation that can be JIT-compiled to machine code. Formats such as minified JS, Web Assembly and Dalvik bytecode are examples of more compact formats for shipping that in the end are passed to a JIT compiler that outputs less compact machine code.
Not only are instructions in intermediate representation shorter than in machine code, but intermediate representation can also take advantage of polymorphism, allowing polymorphic code to be shipped only once, whereas the final machine code may come in multiple monomorphic copies.