Minecraft runs the simulation for every loaded chunk. Now a chunk is mostly only loaded when a player is nearby. That means if you never visit your farm again, trees and crops don’t even grow.
While ticking all the time is possible, it’s minecrafts biggest performance issue, because once every X ms, the whole world is simulated. At some point, the simulation is too big to happen in time.
It’s a bad comparison, but simulating with a bigger timespan (the browsergame approach) is a lot less computation, at least if your game can run while the client isn’t there.
Ultimatively, when the “chunks are loaded”, you need to fall back to method 1 though. Like when there’s always at least one player around.
But that depends on the use case. Think of a browser game: You get attacked. The server calculates how much troops you have gained since the last login. They fight. The simulation sleeps again.
It doesn’t work for games like minecraft when someone is waiting for your trees to grow.
Edit: For Minecraft Plugin NPCs, where possible, the approach of time passed is used as well for performance and to force the player to login and collect the goods.