I know all of this thanks to an old lecture I once attended (not a phone dev), so my information might be a bit off and outdated, but in broad strokes: it's partially due to naive programming practices, but phone manufacturers are also somewhat to blame.
Every app has to poll for new messages on their own. That means opening up a connection just to see if something new is there.
To give an analogy that's easy to grasp: imagine a giant sluice, big enough to fit two oil tankers. Opening a connection is like sending boats through it, the boats are the data, and the water is the power used each time. Now this sluice is a bit funny: once you operate it, it's very efficient and automatic, but it runs twenty times. In other words, you want have at least forty big-ass boats full of data to send through if you don't want to waste energy (to be clear, I just pulled these numbers out of the air; and in a real sluice that would be forty boats both ways, but internet connections are a bit different).
Now imagine you just send a teeny tiny boat checking for new messages each time. If there's a message, data will be sent back (other boats). If not, due to how 2/3/4G work, the sluice will still open and close forty times. That'a s LOT of wasted water. It also takes time to operate the sluice.
Not everyone who develops these apps is aware of this, so some naive app developers poll all the time.
What would be amazing if the phone OS provided some sort of batching system where these polling messages would queue up, and it would connect for all of them at once. I dunno, maybe the newer phones have something like that.