I'd be cautious, as IP was designed to route based on destination IP address, and you will be better off if you can make that happen. For instance, if what you really want is all traffic from a particular virtual server to be sent out a particular interface then use bridging instead.
That being said, you can use multiple routing tables along with routing rules. First you'll probably want to give names to the new tables you will create:
echo 2001 default-via-eth1 >> /dev/iproute2/rt_tables
echo 2002 default-via-eth2 >> /dev/iproute2/rt_tables
Then you need to create your special routing tables, which is easy -- just add the name of the table when you create the route (and 1.2.3.4 and 5.6.7.8 are examples -- use the right IP addresses of your gateways here):
ip route add default via 1.2.3.4 dev eth1 table default-via-eth1
ip route add default via 5.6.7.8 dev eth2 table default-via-eth2
And lastly, you link the two together with "rules":
ip rule add pref 30000 from 10.0.0.100 table default-via-eth1
ip rule add pref 30001 from 10.0.0.200 table default-via-eth2
You can see the rules that are in place with this command:
ip rule
You can see what is in a particular routing table with this command:
ip route show table via-eth1
CAUTION There are problems with this if you use a "containers" type of virtual server, like openvz or lxc, and it is because most programs are written using the "unspecified" IP address as the source address. Therefore the kernel must determine what source IP address to use, and it will pick it based on the route used. And I hope you can see the irony there -- the source address is based on the route which is based on the source address! What seems to happen is that the ip rules are ignored and it uses a built-in list of tables to find the route.