Supervisor will need to be root to start the other processes (like Nginx) with root privileges. That should be fine because Supervisor shouldn't interact directly with external users or accept user input.
Gunicorn should be able run without privileges, you may have to change the owner of the unix domain socket it's using to be www-data instead of root.
Generally in web server scenarios you need root privileges to access files and open sockets on ports below 1024. If your server can't access files, you should change their permissions rather than run with privileges. You'll generally need privileges to open up port 80 or 443 which is why modern web servers start as root, bind to their port and then shed privileges to their running user of www-data or nobody.
In terms of other things you should consider, here's a quick list:
- Ensure your database queries are resistant to SQL injection
- Ensure your document root is well defined and you're not serving up more files than you intend.
- Minimize privileges your database accounts have (they probably don't need table drop and create, for example)
- Avoid any places in code where you're taking user input and executing or evaluating it