One way is to use shorewall which supports this. See MultiISP and Traffic Shaping.
You define two providers and are able to mark which packets should go to which provider. The rules to mark which packets go where can be as complex as you want to define. No need for tun-tap.