Been there, done that. pfSense isn't bad, really; just the implementation has some ugly hacks under the hood that make edge cases exceptionally painful, and pf itself (the filter for which pfSense is named) isn't the best for scalability. It's probably fine for most users though -- certainly better than your typical lowest-bidder, unpatched firmware image from who-knows-where.
I ran pfSense for years -- I guess about 5 -- and wrote an article
about it not too long ago. Eventually moved to a low-power Atom 1U and VyOS (brand new community fork of Vyatta, which Brocade has essentially killed off). I'm very happy with the results.
...if you're familiar with the Cisco IOS CLI, Vyatta is another solution...
Vyatta/VyOS are actually a lot closer to JunOS syntax, FYI. Which is good, since recent IOS syntax makes less sense than ever.
If you're not the DIY type, there's also Ubiquiti, who has their own fork of Vyatta called EdgeOS. Ships standard on all their EdgeMAX routers.