Also considered something like P2P, but it is harder to protect against cheating, I assume?
P2P is extremely hard to make robust on mobile networks (even more so than on wired internet.)
I would not recommend it.
Regarding things happening on a timer, there are multiple solutions.
Cron jobs are fine. They have the benefit of being robust. If the system stops, once you start it, it will catch up.
The draw-back is that it's harder to shard lots of the same kind of work across multiple cron jobs and still stay robust.
Also, when there's nothing to do, the cron job still wakes up, looks at things, and stops, which uses a little more resources than necessary (not really all that much,) and also cron jobs only run every so often, so you will have some amount of latency between "event happened" and "notification sent."
A long-running process is, indeed, more sophisticated, and can use a priority queue of timer-based events to run-at-time.
These systems have much lower latency, and are optimal from an efficiency point of view.
There is the danger that, when this long-running process dies, it will lose the state, so you need to design with that in mind, and once you handle all the failure cases, you end up with either a less efficient system, or a more complex system.
Another option I quite like is to use a message queue of some sort. Ideally one that supports priority keying.
Then, have some number of workers share the work reading from this message queue, and doing the work.
As long as your message queue is durable, and worker-sharing is supported, this system will be robust and efficient, and lower latency than cron jobs.
If you don't want any of that, you can still make it work.
When a player submits their move, you can send the push notification right then and there.
This is as low latency as you can get!
In addition to handling the push notification, you can also have the local game wake up every now and then and "check in" with the server, and display a local notification if a game turn is ready.
You could even make sure to run that polling each time the game is opened/brought to the front. That way, the impatient player can make sure to quickly catch up after emerging from a cave or whatnot.
If there are things that happen on a timer (all of the "build your base" type games do this, as well as Farmville and such) then you simply enqueue "this task is done at time T" and use the delta between "now" and "T" to figure out how complete it is.
This doesn't need a cron job at all; it's purely based on the state. Decay, in turn, is also based on a timer: "this thing was last maintained at time T" and you check how long ago that was to determine the state of decay.