'udp' needs to be escaped because udp is a keyword (RTF manpage).
'gre' doesn't need to because it isn't a keyword.
BTW, it also works if you drop the 'proto' keyword and the escape, ie:
tcpdump -i en0 -n udp
or
tcpdump -i en0 -n gre
Why the difference? *shrug*