Even “traditional” C++ compilers use that technique...
JIT compiling is also an affordable one-time overhead expense.
Not the tracing technique that's currently fashionable! Writing XS to do the same thing without the overhead of op dispatch won't optimize something that's slow because it uses more memory than necessary to provide more flexibility than necessary, especially if running that XS code adds a language barrier that you can't optimize across and which requires serialization and deserialization (or at least prevents you from using non-SVs).
In Perl et al, the hot-spots once identified can be spun off into XS subroutines.
In many cases that won't help.
If this were not so, then Perl, Python, Java, dot-Net, PHP and so-on would never have been done this way....
I'm sorry, but that's a non sequitur.