Mono and Java are essentially the same. Only the ecosystem around them
is quite different. Most sufficiently powerful computer can deal with
both of them.
However, if you talk about "existing architectures" and include embedded
devices, you are right. This will not work mostly. Just because the VMs
are too bulky - for now...
Btw. neither the Mono nor the Java VM emulates any hardware. They are
just JIT platforms where the compiler to assembly language always runs
on the target platform. So the binaries are only an intermediate
language. The important advantage is that this binaries are /not/
platform dependent and, of course, the compiler can use hardware
specific optimization which are impossible when you deliver executables
for a series of platforms like x86 or arm64.
The result is similar than distributing your C++ application as source
code. But without all the drawbacks of compile time source code
incompatibilities and so on.
Of course the intermediate language (or Java Byte Code) is the least
common denominator. You can't do any hacks that won't fit into this
standard (mostly platform specific hacks).
If you look how gcc internally works it does basically the same. It
parses the C++ code into formal execution trees (to some degree
comparable to the Mono IL) and in the second stage the machine code for
the target platform is generated. This is part of the success story of
gcc. If a new language feature is required you only change the first
stage (mostly), then the feature is available on all platforms. If you
port gcc to a new platform you only implement the second stage, and you
get all the language features. AFAIK LLVM works similar (as the name
suggests).
Btw.: the concept of the Transmeta CPUs is similar too. It morphs the
code into platform specific RISC code. The coffin nail was that they
used the (horrible) x86 instruction set as intermediate language.
All modern x64 CPUs operate similar, but they do not write the result
back into memory because the decoder stages are realized in hardware and
operate on the fly.
Btw.2: I am quite sure, as long as C++ code do not use the ugly (and
often platform dependent) reinterpret casts, it could be compiled into
intermediate language too. But probably there is no much existing C++
application around that satisfies this restriction.
Marcel