You should implode all your rules into fewer ones, just as a tip.
Example:
Code:
ipfw add 410 allow tcp from any to me 13000 in via em0 setup limit src-addr 10
ipfw add 411 allow tcp from any to me 13001 in via em0 setup limit src-addr 10
ipfw add 412 allow tcp from any to me 16000 in via em0 setup limit src-addr 10
ipfw add 413 allow tcp from any to me 21000 in via em0 setup limit src-addr 10
ipfw add 414 allow tcp from any to me 18000 in via em0 setup limit src-addr 10
to
ipfw add 410 allow tcp from any to me 13000, 13001, 16000, 21000, 18000 in via em0 setup limit src-addr 10
Next thing: As far as I know, the
setup keyword doesn't work with UDP, because UDP has no setup process (handshake) like TCP has.
For your SYN-issue, you should rather try SYN cookies. They have been invented for exactly the purpose of blocking SYN floods and should work better than a firewall.

gives information about SYN cookies.
A simple sysctl enables them: "
net.inet.tcp.syncookies=1".
As for your state overflow, there probably more than 65536 sessions created by SYN packets. SYN packets are pretty small and can stack up easily.
You could decrease the IPFW dynamic rule lifetime, but that could affect your services by kicking out valid users who are idle or have a lag.