Typically I use
& when I want to run in the background a command which will not take long to run, or one where I won't really care if the program is terminated if I am unexpectedly logged out of a session.
rdesktop 18.104.22.168 &
When working over a VPN or a dodgy remote connection, I tend to use
nohup for running anything which will take a while to run. When running large data imports on a remote host, for example, you might want to use
nohup to ensure that getting disconnected won't have you start over when you reconnect.
nohup ./do_data_load.py mydatafile.txt &
It's also used when a developer doesn't properly daemonize a service, so you have to use
nohup to ensure it isn't killed when you log out.
nohup sillyd &
If you happen to forget to use
nohup when running something like the last two examples, you can use the bash or zsh builtin
disown to the same effect.
$ sillyd &
 12345 # Whoops!
$ disown %1
It's pretty rare to use
&, since you can't really reattach to the nohup'd session if you are logged out. This pretty much eliminates its usefulness for interactive commands. In the case where you have an interactive command you want to persist over sessions or avoid complicated disconnects, you can use
screen. The firepower of a fully armed and operational
screen session is beyond the scope of this post, so you should check it out in more detail.