Haproxy does not appear to really consume the x-forwarded-for header. It appears that it simply replaces it. If you are running on a later version of 1.5 (I think 17 or greater) then you can actually do variable concatenation which means that you can set the x-forwarded-for header yourself without using option forwardfor. I am doing this in a very large haproxy implementation and it is working very well.
Another option is to change the haproxy option forwardfor header to use a different header. This means that on the nginx server you would have to look at two headers. The one from varnish would have the end user IP address, the one from haproxy would have the varnish servers IP address. To do this, the haproxy config looks like this:
option forwardfor header varnish-x-forwarded-for