When the kernel is looking for a route for an outbound packet, it wants to find a single answer: if there are multiple matches, it doesn't know which one to pick.
This thread on the freebsd-questions mailing list covers the same question, and suggests solving the problem by "splitting" one of the routes to create two more-specific routes:
The trick to adding a backup default route is to split 'default' into 2 different and more specific subnets:
# route add 0.0.0.0 PRIMARY_GW -netmask 127.0.0.0 # route add 127.0.0.0 PRIMARY_GW -netmask 127.0.0.0 # route add default SECONDARY_GW
Now that default is split into 2 different smaller subnets than 'default' they will be the preferred route. If your interface that connects PRIMARY_GW goes down, the first 2 routes will be removed, leave your backup 'default' gateway to take affect.
In your case, if you want the existing route (via 192.168.29.4) to be used when it's available, you would want something like this:
route add -net 192.168.33.0/25 192.168.29.4 route add -net 192.168.33.128/25 192.168.29.4 route add -net 192.168.33.0/24 192.168.27.2
Because the kernel always prefers the most specific route, this will use 192.168.29.4 as the gateway as long as the ovpns5 interface is available. If that interfaces goes down, the routes will be removed and the kernel will start using the 192.168.27.2 gateway.
If you're hoping to load balance between the two connections, you're looking for equal-cost multipath routing (ecmp), and I'm unclear on the state of support for that with FreeBSD.