Huge Tiled Levels

Hey there!
In the game I’m working on right now, every level is procedurally generated, and the world is entirely tile-based. The levels are pretty big at this point, so on average, a level has anywhere between 10000 and 20000 tiles, each with their own Collider and Mesh. Surprisingly, the game’s performance is pretty good on even low-end computers, but every couple of seconds, there’s a slight hiccup in the frame rate. It’s not a huge problem, but it does get a bit annoying, so I’m wondering if there’s any way to optimize the tiles a bit.
Since the tiles are destructible, they need to be separate entities, so I can’t put them all together. I’ve tried implementing scripts that turn off their renderers, remove their colliders, or even deactivate them altogether while off-screen, but the hiccups still remain, even if they get a bit smaller. So, I’m assuming that this is either related to the sheer number of objects in-game or something to do with garbage collection, but I’m not sure which.
Has anybody else worked on a game in Unity that uses such a large number of objects? Are there any methods of avoiding the hiccups I described?
Thanks!

Are you using the Umbra occlusion feature?

Oh, I forgot to mention, the game is in an orthographic side view. That probably has a fair amount of impact on any technique you’d use to optimize it, sorry I left it out.
The levels are all procedurally-generated, so I’m not sure I can make use of occlusion culling. Is there any way to add occlusion areas through scripting?