I was also dealing with delayed notifications in most of the apps in my phone. Finally after long searching on the Internet and trying common advices as a disabling battery optimizations, Adaptive Notifications and all those features that didn't help at all, I found the XDA Developers forum where I finally got to the bottom of this issue.
This problem is caused by functionality called as "DOZE", which is implemented in the Android core since Android 6.
https://developer.android.com/training/monitoring-device-state/doze-standby
Basically what is does is that it tries to preserve the phone battery life in a very aggressive way that basically puts all applications and network activity to standby until the maintenance window occurs. The maintenance window is a very short time period where all events from applications waiting in the queue are processed at once and then it puts all apps to standby again until next maintenance window occurs.
Problem is that with every next maintenance window the intervals between those windows are increasing every time up to some long limit. So if you haven't touched your phone for a longer time, like half an hour and the event happens, you will get the notification in the next maintenance window that may be tens of minutes from that moment.
I don't know how Google can act as this is OK. It is NOT!! For me it was causing serious problems with my Forex trading app that didn't display price alerts on time when the event happened but like 5, 15, 30 minutes or even almost 1 hour later !! which is not useful for me because the opportunity for the trade was already gone...
So solution is to disable the "DOZE" in your phone manually using ADB commands. I did it and it works, now I get instant notifications. Unfortunately this has to be done every time after phone reboot as it turns itself the DOZE back on again.
Here is a page with more details:
Android: completely disabling deviceidle ("Doze") in Android M?
Basically you just issue this ADB command: dumpsys deviceidle disable
You can also put the application to the Doze whitelist but not sure if it works, when I displayed the list, I found out my trading app was already there, maybe because I removed it from the Battery saving policy but the Doze was probably still suspending everything so it worked only in those maintenance windows. I guess it doesn't use those "high-priority FCM messages" described in the DOZE description to force the notifications instantly.
If you are not familiar with ADB, here is some info:
https://developer.android.com/studio/command-line/adb
I used a paid app that allows local ADB connection from the phone directly, so I can disable DOZE after every restart. More info here:
https://forum.xda-developers.com/t/say-hello-to-ladb-a-local-adb-shell-without-needing-root-or-a-computer.4204855/
It is very sad that this basic feature as an instant notifications have to be fixed via the developer debug interface by user instead of Google who could fix it in the OS itself...shame on Google...
More forums on this topic:
https://forum.xda-developers.com/t/psa-how-to-fix-the-notification-delay-or-non-receipt-issue-truly-pathetic-of-google-and-samsung.4276505/
https://forum.xda-developers.com/t/delayed-notification-problems-s21-ultra.4243105/page-5