Signal uses the socket-io library to maintain an open socket with their backend; it's incredibly resource intensive.
Tutanota uses the SSE API for their push noticication service and does a pretty good job on their end as it relates to battery consumption.
That said, if every app were to implement their own push notification service, 5+ apps doing on a device that turns a "mobile" phone into something that always needs to be plugged in. It does not scale.
I ran a test on Android using kmp-tor and a ktor server exposed as a hidden service, pinging it every 5 min via cronjob from my server at home. Over 24h, battery consumption was about 5%-7% depending on the test device.
Working on a product right now for drop in replacement to google/apple services, but it's far from ready.