I have all three in production right now but as LB's and/or caching for HTTP requests. Not sure how many concurrent connections you expect but in our environments we have anywhere from 500 to 2500 requests per second.
We run all three on RHEL 6 and 7.
a. HAProxy
Pros: Pretty simple configuration file.
Fast with low overhead.
Great output from stats plugin if enabled.
Cons: Runs as a single thread by default and changing to multithreaded operation is not recommended (per the docs). This caused performance issues when dealing with 1500+ requests per second. CPU usage was vastly superior vs NGINX.
No caching capabilities AFAIK.
Not as many logging options as NGINX.
b. NGINX
Pros: Really stable. Multithreaded, can handle considerable workloads on commodity hardware w/o running into performance issues.
Logging can be augmented by using dynamic variables which is nice to get performance stats and for debugging.
Lots of added functionality by compiling with optional modules
Cons:
Stats page provides minimal feedback although there's a commercial plugin in LUA that does a really nice job.
c. Varnish
We use this in a smaller deployment mostly for caching and because we wanted to evaluate it. I can't really provide a lot of feedback here since it hasn't gotten as much traffic as the others however on the few tweaks we wanted to perform we found the configuration more difficult than HAProxy or NGINX.