First, the impressive thing with UML is that it was possible at all. When UML development started, Linux was already very close to being able to host itself. On i386, the only problem was that ptrace was unable to modify system call numbers. Once this was fixed (with a trivial patch), Linux was capable of hosting UML.
On the other hand, though the capabilities are there, in some cases, they are not very efficient.
The major offenders are UML memory management and system call interception.