From TechNet Library
After a deadlock is detected, the Database Engine ends a deadlock by
choosing one of the threads as a deadlock victim. The Database Engine
terminates the current batch being executed for the thread, rolls back
the transaction of the deadlock victim, and returns a 1205 error to
the application. Rolling back the transaction for the deadlock victim
releases all locks held by the transaction. This allows the
transactions of the other threads to become unblocked and continue.
The 1205 deadlock victim error records information about the threads
and resources involved in a deadlock in the error log.
So, your transaction is safely rolled back and you may try it again.
EDIT
Being a lazy a**e, I haven't read your question thoroughly.
Let's see:
Is it safe to do something like this for command and/or connection timeouts?
I wouldn't do the same kind of generalization, because you could end up trying to read data from database that isn't accessible at all. You should have a maximum numbers of retries.
I mean, it's not possible for work to complete on SQL Server, only to
timeout before the data gets back to the caller, is it?
Never heard of that, and it shouldn't be possible if you use transactions. And you should be using them, along with XACT_ABORT, the flag that Specifies whether SQL Server automatically rolls back the current transaction when a Transact-SQL statement raises a run-time error.
However, it is possible for work to neither complete not not-complete - see zombie transaction.
I just found this as well.