An alternative is that the mobile device pulls from time to time, but that's quite power intensive or, when using a long interval, is slow.
Instead one has an idle connection open to which the server can send messages.
For example- Let's say you wish to send a notification to user A when user B sends him a message. In this scenario, you can call another FCM fn, using the token user A had generated. Of course you can use the web dashboard to send the notifications, but in this case, you would not be able to send event-based notification reliability and in real-time. Other services also work in a similar manner.
Imagine if every program on the users phone had their own schedule for checking for updates against remote hosts. That sounds terribly inefficient and wasteful of power, as the applications would need to "wake up" (as in, consume processor cycles) to initiate and perform a check.
If you get to the stage of sending millions of notifications per day then you'll need to start paying,