Perhaps paste the output of: /tsctl all from IRC as an oper will help. If there is enough lag or a large TS offset, then disconnect notice propagation may be delayed.
That means that server1 and server2 have processed the clients exit, but services hasn't hear about it yet. So when user2 reconnects on a different server, Anope sees them as user4 because it still sees 1-3.
Unreal has a built in ntp client to sync it's clock, Anope does not, so on machines that don't have ntp installed there is already a local ts offset between services and the ircd it's connected to even though it's on the same machine.