A look in the doce of systemRequestedQuit() reveals:
This callback is called, whenever someone or something tries to close your app. That can be Cmd+Q or the system going down, closing the main window etc. It is provided to give you the chance to abort shutting down your app or to show a “save or discard” dialog.
The shutdown() instead will be called to clean up anything you created in initialise(). It is provided for symmetry. But also it is beneficial for some things (like e.g. opening audio devices) to do that separate from constructor and destructor, so you can create things asynchronous.
Do you use any thread or similar yourself, that could be responsible for the waiting at shutdown?
I didn’t experience that so far…