I would probably queue up the background job and pass the jobs record id. This can manage the state of the background job. Once the job finishes, it can attach to this record the zipped file. It can then send out the notification and the user can download the finished zip.
You could create a PORO, view component, helper or partial which has a generic modal. From there, you could pass in the locals required for the title, content, etc. Personally, I don't mind creating a new modal for this kind of stuff, but I do see the benefit if modals are a primary way that users interface with the application.