I never really have used batching from those engines, but don't they require you to upload data to GPU every frame?
You can do something like that with VBO's. Put all the static level tile data which never changes into big fat VBO and never change it, just render it at an offset. Isn't that better than putting data every frame into "batch"?
I think LibGDX's SpriteBatch indeed only supports streaming data to the GPU, but that's simply because sprites are dynamic objects that move around a lot. It would indeed be better to use chunks stored in static VBO as pitbuller said to avoid having to set up and upload the tile data each frame, but the thing is that this also qualifies as batching. A chunk is a "batch of tiles" so we don't have to use one draw call per tile.
It should be noted that these are usually premature optimizations -- good to keep in mind, but probably not worth the hassle unless you actually find that your tile sprite batching is causing your game to be vertex bound.
Also equally important to realize where the bottleneck is; if you see tile map rendering killing your FPS, it might not mean that static VBOs will help if your bottleneck lies with fill-rate.
In most cases a SpriteBatch like in LibGDX will perform just fine.
Which optimization are you referring to? Batching and frustum culling are both very important optimizations if your world is so large that some of the objects in the game are outside the screen. In 2D, you often have vast tile levels that are much larger than your screen. Sure, you may be able to attain 60 FPS without batching or culling, but low-end computers might struggle. People are generally not very accepting of performance problems in 2D games. In 3D games, at least frustum culling is essential. Minecraft (or any game for that matter) without culling = 5+ times more work due to rendering blocks behind you. Remove batching as well, and you'll be doing millions of draw calls each frame (this is Minecraft specific though), which is 1000x more than you can do at 60 FPS on high end.
Regarding bottlenecks: Batching helps with CPU performance. Frustum culling helps with both CPU performance AND reduces the number of processed vertices. Vertex performance isn't very important, at least not in 2D games, but the reduced CPU overhead of not rendering things that are outside the screen is often at least noticeable.