I'm making some assumptions on your setup and how exactly your ISP is giving you these IPs, so if any of this is wrong I apologize and will happily change my answer
For your internal network I would suggest you setup a DHCP pool for your workstations and statically assign IPs to your servers. I'll leave the DHCP pool setup for you, as I think you're mainly aiming to make sure both public IPs are utilized by the proper networks.
i.e.
172.16.1.0/24 for your workstations, with DHCP, assigned to VLAN10
172.16.2.0/29 for your servers, statically assigned, on VLAN20
That all being said here is what I personally would try and setup to get your gear online.
int g0/0
ip address dhcp
This will pull an IP from your modem and give it to your external port. I suspect it will be an ISP internal IP because I doubt they'd give your modem a publicly routable IP. That'd be weird.
In this scenario, you should not be manually inputting any default routes on your router as it should all be supplied from the DHCP pull.
int g0/1.10
ip address 172.16.1.1 255.255.255.0
int g0/1.20
ip address 172.16.2.1 255.255.255.248
This setups the internal gateways for your two networks. So all your workstations will be pointing to 172.16.1.1 and your servers to 172.16.2.1
After that you'll need to setup NAT rules on the router to handle passing of traffic outwards for your workstations.
int g0/0
ip nat outside
This setups your external facing interface as your outside nat interface.
int g0/1.10
ip nat inside
This setups your internal facing interface as an inside nat interface.
Router(config)# ip nat pool internet 128.66.0.2 128.66.0.2 prefix 24
Creates a NAT pool named internet being translated to one of your public IPs.
Router(config)# ip nat inside source list 7 pool name internet overload
This says to NAT all IPs in list 7 to the NAT pool you just created and that you can overload it. Which is to say more than one internal IP can use the same external IP.
Router(config)# access-list 7 172.16.1.0 0.0.0.255
Creates the list referenced in the previous command. Now onto NAT for your servers, which I suggest be statically assigned if you want them publicly available.
int g0/1.20
ip nat inside
Same as before, this setups your internal interface as an inside NAT interface.
Router(config)# ip nat inside source static 172.16.2.(2-6) 128.66.1.(2-6)
A new line for each static assignment is needed. This creates a static translation between your internal IP and your external IP that was assigned to you.
As for your switch; all you would need to do is properly tag your ports depending on what is plugged in and make sure your trunk is passing both VLANs.
At this point both subnets should hitting your router, and your router should know where to pass the traffic, be it internally (your workstations getting to your servers) or externally (internet). Access control can either be setup with ACLs on the router, a stand-alone firewall, or firewalls on your servers.
Now this all hinges on how your ISP has your modem setup. If it works the way I think it works, when your external interface pulls it's information through DHCP, your router should populate both your public IP ranges so that when your router NATs it knows where to send your traffic.
I suspect someone will give a better written answer, but hopefully this points you in the correct direction.
I also referenced the following link for help on the NAT parts as they are definitely not something I play with very often.
http://www.cisco.com/c/en/us/support/docs/ip/network-address-translation-nat/13772-12.html
1.) Yes, the gateways should reside on the L3 switch. If you were running Routing on a Stick, you would instead house their gateways on the Router. Your current configuration is inline with what is called a "collapsed core" design. Where the L3 core performs both switching and VLAN routing and acts as a distribution layer.
2.) No, your L3 routing should be occuring on your 3750.
3.)If the cable modem is in bridge mode, there should be no double NAT. Bridge mode should disable all the routing features and leave the cable modem as just a cable modem.
4.) I would, just so you can hit devices on the seperate VLANs.
5.) The address of the inside interface of the Cable modem may be .1. Leave it as it is. Like Ron said, it doesn't need to be changed.
Can we see the NAT configuration of your router? It will be helpful in identifying your NAT issue.
****EDIT****
This link may be helpful: Configuring NAT I failed to take note of the NAT statement you had originally. This brings into question the claims made by your ISP. You're both able to hit the internet and your being PAT'd with the correct commands. Are you experiencing any problems?
Best Answer
Yes, you'd use two VLANs:
The TRUNK port to the Linux router will carry both VLANs (tagging one or both.) The linux router would then have a physical interface (eth0) and one or two vlan interfaces (eth0.X and eth0.Y -- depending on the numbers you choose for your vlans) I suggest two tagged VLANs to avoid any confusion between eth0 (untagged) and eth0.#. From there, networking is the same as having multiple physical interfaces.
(NOTE: if you use wireshark/tcdump, there are many buggy nic drivers that continue to eat vlan tags in promisc mode. As a result, capturing eth0 may not include any dot1q tags making the traffic look like it's all on the same network. Also, some management adapters will remove tags, even if the system management board isn't there. Broadcom is well known for this.)