Educate me if I am wrong, but there are natively compiled Erlang modules, but no longer any natively compiled Erlang. It only runs on the BEAM, and ever since BEAM/C fell out of use in OTP R5 no native code is generated.
BEAM is still present but HiPE interfaces with it using some specific ABI that allows mixing AOT compiled native modules (just machine code) and the BEAM register machine. I'm not sure if there are new caveats as I regard HiPE as a compatibility feature rather than something under active development (I may be wrong but it seems to fail to compile all of OTP's Erlang code now).
The overhead of that context switch is a bit high but it allows the code loading facilities of the BEAM to reload HiPE compiled modules. This works because all processes yield to the scheduler, which acts as a kind of code-swap safe-point. The usual module-local vs module-remote call rules apply here when old versions are purged.
Native compiled modules are called NIFs or Native Implemented Functions. these are functions written in a compiled language (usually C but there are other bindings like Rust, etc.) The downside is an NIF is kind of a black box as it can't easily call back to native erlang functions without some rpc hackery. They're great if you need to do something which just returns a value. Typically, they are used for high computational speed or accessing things like hardware not available through native interfaces. See the Erlang interop page for more details: http://erlang.org/doc/tutorial/introduction.html