I would be looking at your SQL configuration. Consider setting the database into simple recovery mode during the process.
I would also be looking at things like the location of the log and database files and if they are on the same disks and you can keep them on separate spindles do so (although with Fusion cards it may not make much difference).
I would also be looking at the location of the tempdb,
Finally I would also set the initial size of the destination database to a size that is practical, this will prevent auto database growth during the process, having an auto grow job will stop any processing until it is complete as you can imagine this can kill things pretty fast.
There are a lot of performance counters that you can monitor for SQL to see where things are going wrong, but in my experience with E9 on SQL 2008 R2 there are a ridiculous amount of indexes on tables and that can impact the performance.
One thing that you might be able to do with regards to indexes would be to disable the indexes and constraints on the destination database, but I would be checking with Epicor on that one first though. You could enable the indexes later and perform a reindex (this might take a while also)
An average disk queue length greater than 2 is telling you that you have an I/O problem.
Redgate have some handy free tools that help you analyze instances of SQL,
I have also used the PAL tool which is very useful for analyzing Windows Performance counter logs, and has some great reports.
I have also had another thought, but it is just a thought, and not sure if it is feasible, but what about performing the upgrade in the cloud, there you could through as many resources as you wanted at it.at the end of the day you are just after the resultant database, and I bet there will be a fair bit of index fragmentation and free space in that database.
I’s be interested to know what the resultant size of the compressed backup is.
I hope the information helps.