True, there are some functional limitations. My comment was more about looks and readability (assuming sufficient functionality) and is not to be taken as an argument against switch/case support (I've never wished for it, let alone needed it, but I have nothing against it either).
An idea (and just that) regarding the first limitation could be this:
alias moo {
var %moo = $1
goto %moo {
:cow
echo -a moo cow
goto break
:dog
echo -a moo dog
goto break
:cat
echo -a moo cat
goto break
:%moo
echo -a moo mouse
} | :break
}
Granted, this uglifies the code a little bit, and the same "goto break" command can't be used in more than one blocks etc, but it's not inefficient in any (significant) way.
The inability to have labels with spaces or identifiers is more serious imo though (and perhaps the only use I'd have for switch in my scripts).