x86: mov eax, [ebx]
x64: mov rax, [rbx]
In both cases, ebx/rbx is a pointer to a
virtual address. The MMU, a highly integrated part of the CPU, translates that address to a
physical address.
Claiming that "all addresses are 64 bit" is misleading. In compatibility mode, the MMU certainly translates a 32-bit address to a physical one. Unfortunately, I have not been able to find a doc that clearly says whether that physical address is in the section below 4GB. or whether it's possible that mov eax, [ebx] talks to a physical address above that area. If that is the case, the MMU will still hand over a 32-bit address to the CPU in compatibility mode. Btw the name is misleading: "32-bit mode" would be simpler and more correct. The cpu has more than one mode, fullstop.
In any case,
it's hardware, not an emulation. An emulator is quite a different animal.
Steem, for example, translates...
MOVE.W MODE(A6),D7
BTST #0,D7
BEQ.S SCR_ENDE
BSR.S PPL
BTST #1,D7
BEQ.S SCR_ENDE
BSR.S PPL
BSR.S PPL
... into something that can be understood by an Intel or AMD CPU. Below an example of a BASIC program that firmly believes it's running on a 68000 CPU.
Yet another story is
Wow64: Instead of running a complete parallel 32-bit version of Windows, all 32-bit processes that need to access the core Windows APIs go through a "gate" that translates their 32-bit handles etc to 64-bit equivalents and then call the native 64-bit DLLs. That process is so fast that you won't find any significant performance difference between 32- and 64-bit processes. In contrast,
an emulator is typically a factor 10-20 slower than native code.