Completion in Zsh alone made it worthwhile for me. The completion scripts for Zsh are worlds more powerful and complete than anything I've found for Bash.
I've been using fish exclusively for about 2 years, and the only thing I really missed was smart tab-completing multiple directories, like cd l/a/t/b<tab> completing to Library/Application\ Support/TextMate/Bundles even if there's another top-level directory starting with L.
Fish's consistent syntax for conditionals/loops is what brought me over in the first place, I always needed to work to remember what goes where in zsh/bash. For one-off tasks the reduction in mental overhead was a _huge_ win.
That said, I recently did switch back to zsh for a functional command-not-found handler - fish's only includes the name of the binary rather than the whole command, so I couldn't productively use it as a retry wrapper.
Definitely this. I switched to Fish for a while and was very happy, but the lack of Bash compatibility got a very old after a while. You never think about how much out there assumes you have a sh/bash-compatible shell running, and watching ordinary tasks fail hard because of an incompatible shell gets very, very frustrating.
And, there's even a script that offers Fish-like syntax coloring for Zsh: https://github.com/zsh-users/zsh-syntax-highlighting/
But not having used Fish yet myself, I can't really offer any reasons to use Zsh over Fish.