OK, I give up. Actually I asked another question related to this topic before developing the application but the answers were similar to yours. (
I had to use monkey-patching to allow dynamic AUTH_USER_MODEL but it wasn't a good idea so later I decided to separate the admin part and use different AUTH_USER_MODEL settings for each app. However, even separating the applications does not solve the problem because the core Django code does not assume that I can have different AUTH_USER_MODEL settings even if I use them in different server instances.
Actually the customer model and staff model don't share and fields except password, last_login and created_at but since I use OneToOneField in order to map extra fields it's ok to store all common type of data in one table.
I don't really like the idea of providing a regular customer user for staffs because when a staff logins into admin site, he/she also logins into the frontend site which makes harder to view the site as anonymous. Also it becomes much more difficult if I develop a feature "Login as x customer".
The only useful solution that I found is to move the admin page to another subdomain (with reverse proxies like nginx) in order to prevent them to share cookies. And I also created 2 proxy models called customer and staff and modified their managers so that they can act like separate models.