I may be misunderstanding your situation and I've certainly never done anything of this sort with freebsd, but...
A quick examination of the lagg makes it look like a layer2 redundancy mechanism where the IP address is floating between a number of interfaces but the IP address never changes.
On your DSL links -- are they to different providers? If they are then I think you'd need a layer 3 aware mechanism.
If they are to different providers, you will need to do something with your routing tables so that link 1 goes to one set of remote ip addresses and the other gets the rest, or maybe one interface is used for outgoing web traffic and the other is used for everything else. Typically this is done with "policy routes" for small organizations and BGP for larger organizations.
Lastly, I'd look into pf instead of ipfw. It's super sophisticated and fully awesome.
Example pages that discuss what you're looking for
The above article has a discussion of how to load balance outgoing traffic.
I only looked at the pf docs for a second but it doesn't seem as though there is a link tracking or ping tracking mechanism directly in the pf functionality.
I'd just make 3 pf config files -- only.link1, only.link2 and balance.links. Then, make sure that in the balance links config you don't balance traffic to the next hop (so traffic to the next hop of link1 never goes through link2 and the reverse). Then, run a script that does a ping test to the next hop of each interface and if that fails switch pf configs to the other interface exclusively. Networking equipment that does vrrp often has this sort of functionality, but built into the device not as part of a hacked on perl script, but it should work just the same.