The fallback function is a feature of the Solidity language, and is not an EVM-level feature. Solidity simply parses the
msg.data field in transactions according to the ABI:
When the code is compiled, the ABI signatures are stored in the compiled code, and when the code is called, it looks to see if the first four bytes of the
msg.data corresponds to one of its functions. If so, it calls that function with the rest of
msg.data interpreted as arguments. If not, the fallback function is called.
Serpent could implement a similar system, but I don't know enough about Serpent to say how it could be implemented.