zsh is not fully bash compatible. There are a variety of differences. Newer zsh is more compatible with bash (=~ supported, exec now has the extra flag options, etc) but full compatibility is not a goal, not even under "emulate".
For instance, bash substring is ${foo:offset:len} but in zsh it's $foo[start,end] and that's just one simple example.
zsh is a tcsh and ksh influenced shell which does many things its own way; POSIX compatibility is explicitly not a goal, but the developers are responsive to patches which add options/emulate behaviour that get things closer to POSIX. But when you start really getting into the power of the shell, you start creating write-only scripts, more so even than bash.
bash is POSIX sh + ksh + pedanticism, with some features now copied from zsh. It too has write-only scripts but because it has less powerful operators, you end up not using the conciseness of zsh and things might be more readable (except for all the quoting to avoid whitespace split, the stupid ksh-style $array means first-element-of-array, not all-elements-of-array, etc etc).
Writing scripts which take full advantage of the power of either shell is unwise, unless you're in a constrained environment (eg, writing system rc scripts, where some FSs might not be mounted, etc). As an ideal, use Perl/Python/Ruby/whatever for anything big enough that you need the expressiveness not in Bourne sh, if you want others to be able to maintain it. Keep the shell stuff for things relating to the interactive shell (tab completion programming, etc).
I wouldn't use bash over zsh. I'd use bare sh over zsh for simple scripts, or switch to a language where associative arrays have decent operators (unlike in zsh, where they are, again, 'concise'). I might switch a sh script to bash if I need that one little feature to extend an existing proven-working script and don't have time to rewrite it now.