It can be done using Linux Network Namespaces.
Here is an article that explains how. Basically you create a network namespace with a different default route and run the processes that need it there. You connect the newly created network namespace to the physical adapter with a bridge (but other solutions are possible of course).
Update: from kernel 3.14 it's even easier using control groups, as described in this article. You have to:
1) define a net_cls control group to annotate the packets from a given process with a classid (or group of process, note that there hasn't to be any parent-child relationship between them)
2) use the iptables cgroup module (added in Linux 3.14) to fwmark the packets
3) use policy routing (ip rule add fwmark ....) to create a new routing table for the marked packets
The advantage is that we don't have to do the bridging thing and everything is much more dynamic thanks s to cgroups.