I have a design question. The challenge I'm facing is that we have many PBXs that we host (let's say 100) for different clients. We are looking for a single SIP proxy that will allow us to proxy all the different phone registrations and RTP traffic to the correct PBX
This is backwards from the normal SIP proxy scenario. A SIP proxy takes inside registrations and proxies them to a remote SIP server on the outside. It kind of sounds like your application is more along the lines of a session border controller for your PBX server farm.
My thoughts are we could either do this via hostname where we point the phones to ABC.companyname.com which would point to the proxy's outside IP and then based on the name the proxy would determine that the phone belongs to a certain PBX and proxy the connection to that PBX on the inside of our network. Or we could use port numbers and if a phone is pointed to port 1001, then it belongs to PBX1 on port 5060. If the phone is pointed to port 1002 then it belongs to PBX2 on port 5060 etc. All the PBXs will have private IPs and the SIP proxy will have an interface on the PBX network and another interface on the internet with a public IP.
I would look into SRV records in DNS to accomplish this. An SRV record takes a hostname and references not only one or more IP addresses but also protocols and ports. So a phone that registers to PBX1 would have a SIP server hostname of pbx01.example.com and one that registers to PBX73 would have pbx73.example.com. DNS will assign IP addresses and ports, and can support redundancy and load balancing. Adtran SIP devices all support SRV as do most other SIP applications. https://en.wikipedia.org/wiki/SRV_record
Would the proxy take into account if two remote NATted phones which are registered the same PBX are calling each other to properly handle the RTP traffic between them?
Maybe. This is referred to as media path optimization and it depends on the functionality of the NAT device and/or SBC involved and how it manipulates the SDP. Depending on scalability the Netvanta 6000 series may not be what you're looking for. You may want to look into something along the lines of a Sansay VSXi for this type of application.