I got this solved once I had some sleep. There were 3 problems.
1. I reversed the routing with putting the gateway for the router out of usb0 and then I did not need a static route. The routing table is pretty interesting.
2. The MASQUERADE part is not needed. The cellular device at 192.168.1.1 does the bulk of the network address translation. The DNAT stuff is short for "destination NAT" and only changes - well - the destination address so it will know to go to the server I specified.
3. The gateway for the web server. It really clued me in when I could not even ping 8.8.8.8 from the web server through the cellular device "internal" at 192.168.1.1. Using the cellular device "external" at 192.168.1.109 for gateway or the "internal" as before is improper and a red herring.
It is really confusing that there is an address on usb0 at the computer side "externally" at 192.168.1.109 in this case and an address on usb0 on the logic side "internally" at 192.168.1.1. It is the USB network inside the ethernet network. Like a Matroska doll. But maybe I have been thinking at this for too long now.
Michaelk you found the problem perfectly. It is good to know that if I did not figure it out someone else would have.
This is just a code snippet. The actual router code is going to be much larger.
Code:
sudo sh -c "echo '1' >> /proc/sys/net/ipv4/ip_forward"
sudo ifconfig eth1 up
sudo ifconfig usb0 up
sudo ifconfig eth1 192.168.1.19
sudo ifconfig usb0 192.168.1.109
sudo route add default gw 192.168.1.1 dev usb0
sudo iptables -A FORWARD -i usb0 -j ACCEPT
sudo iptables -A FORWARD -o usb0 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -j ACCEPT
sudo iptables -A FORWARD -o eth1 -j ACCEPT
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.3:80
192.168.1.19 is default gateway for 192.168.1.3