You're absolutely right, I have checked our draw calls, it stays around 300 when there are thousands of characters so I think sprite batching is working correctly with Godot's internal design (and I double checked we don't have anything break the batching https://docs.godotengine.org/en/3.5/tutorials/performance/batching.html).
However I do notice fps drops a lot when I instantiate new characters or destroy them, I tried object pooling already but didn't seem to improve that a lot, idk if I'm doing it correctly though.
As you might noticed I'm pretty new to some of these optimization stuff, though thx for your ideas and feedback!