Would you have any advice on avoiding multiple xmobar or dzen
processes running as a consequence of XMonad restarts?
You should only be starting them from xmonad as part of DynamicLog, in which case they go away when the xmonad that started them does.
If you must start things not over a pipe from the startup hook (this is strongly disrecommended; this is what ~/.xsession is for), you can check for command line arguments.
, startupHook = do args <- getArgs
guard (null args) $ spawn "xmobar"
--