Thks for the response Kovid, and confirming format_abspath isn't disappearing quite yet to give me time to rethink things...
Luckily I don't have any usages of cover() and format(), though that doesn't mean anything in terms of the bigger scheme of things.
Here are the issues I have that come to mind currently:
(1) Modify ePub and Count Pages - change to use db.copy_format_to() as you suggest. These are the "easy" ones relatively speaking though it requires a bit of refactoring since I currently pass paths around. Incidentally I wouldn't want to use the copy from db.format() because I would presume I have no control of the lifetime of the directory in that situation. Waiting until Calibre exits is "too long", and db.format() gives you no control over the directory.
(2) Extract ISBN - I was wrong about this plugin in that it doesn't currently copy files since it can end up scanning every format for a book. I shall have to bite the bullet and copy all files for a book as each book is processed I guess.
(3) Find Duplicates - this is a real problem for the binary comparison. Copying files just so you can compute a hash on them? Performance would go to the toilet - remember this is comparing every single format of every book in your library, and it makes use of the file timestamps to decide whether to recompare. Welcome any suggestions on this.
(4) Quality Check - the Check ePub functions in this are likewise a major problem. As once again every single ePub in your library is going to have to be copied every time you run a check. Again no ideas on how to resolve this currently
(5) Open With - if what you suggest of watching a temporary file with a thread is the only solution then it has to be so (in which case your help is much appreciated). Though should you close Calibre while having the app open that will have some implications though (temp files not being cleaned up due to file locks, users losing changes etc).