You're not doing anything wrong and I don't think this can be handled directly with client_disconnect() or Disconnect Reason. The problem is the user disappears/drops off and the server does not immediately realize it. Eventually it realizes it has not gotten any responses from the user after X time/attempts so it then calls client_disconnect()...by this time the player is long gone. I just tested a similar scenario where I joined a game and then terminated my HL.exe process. It took 1 minute and 9 seconds for the server to drop me.
You can try to find a function that pings a player using orpheu and react based on the response, or lack thereof.