Apache/PHP to Nginx/Tornado/Python
I'll go point by point: 

Yes. It's ok to run tornado and nginx on one server. You can use nginx as reverse proxy for tornado also. 
Haproxy will give you benefit, if you have more than one server instances. Also it will allow you to proxy websockets directly to tornado.
Actually, nginx can be used for redirects, with no problems. I haven't heard about using redis for redirects - it's key/value storage... may be you mean something else? 
Again, you can write blocking part in django and non-blocking part in tornado. Also tornado has some non-blocking libs for db queries. Not sure that you need powers of django here. 
Yes, it's ok to run apache behind nginx. A lot of projects use nginx in front of apache for serving static files. 

Actually question is very basic - answer also. I can be more detailed on any of the point if you wish.
Our website has developed a need for real-time updates, and we are considering various comet/long-polling solutions.  After researching, we have settled on nginx as a reverse proxy to 4 tornado instances (hosted on Amazon EC2).  We are currently using the traditional LAMP stack and have written a substantial amount of code in PHP.  We are willing to convert our PHP code to Python to better support this solution.  Here are my questions:

Assuming a quad-core processor, is it ok for nginx to be running on the same server as the 4 tornado instances, or is it recommended to run two separate servers: one for nginx and one for the 4 tornado processes?
Is there a benefit to using HAProxy in front of Nginx?  Doesn't Nginx handle load-balancing very well by itself?
From my research, Nginx doesn't appear to have a great URL redirecting module.  Is it preferred to use Redis for redirects?  If so, should Redis be in front of Nginx, or behind?
A large portion of our application code will not be involved in real-time updates.  This code contains several database queries and filesystem reads, so it clearly isn't suitable for a non-blocking app server.  From my research, I've read that the blocking issue is mitigated simply by having multiple Tornado instances, while others suggest using a separate app server (ex. Gunicorn/Django/Flask) for blocking calls.  What is the best way to handle blocking calls when using a non-blocking server? 
Converting our code from PHP to Python will be a lengthy process.  Is it acceptable to simultaneously run Apache/PHP and Tornado behind Nginx, or should we just stick to on language (either tornado with gunicorn/django/flask or tornado by itself)?