To OP - 25k batches is a lot of batching work, which I’m not 100% is the cause, but it’s a high number. One of the most important things to do in general is merge meshes (either in runtime code or a modelling package), since more meshes = more batching work for the CPU. It is generally well-worth having big meshes that result in coarser occlusion culling, than many small meshes that all need to be set up for rendering by the CPU.
Some additional tips, and some gripes with HDRP:
Very important to find the ‘light distance’ and ‘shadow distance’, and ‘reflection probe’ distance options hidden in the cog icons. By default they’re set to effectively infinity. Since lights & probes don’t get culled properly, this means unless you fix a distance (usually by gauging if the player will notice or be able to see it), every light & probe in your scene is rendering by default, as well as every shadow, killing performance.
Planar / realtime reflection probes are not remotely performant and for tech demos only, or tiny rooms with a mirror (and not much else), and need a script killing the probe if they player leaves the area.
In general (main gripes here); real time shadows are utter framerate killers. Realistically if you have an ‘average’ complex scene (say 1m tris), one or two real time shadow sources are your limit in any given frame, maybe 3-4 if you dial down the resolution to pixel-art levels. This results in a lot of awkwardness, since a light behind a wall that’s not casting shadows will have it’s volumetrics and light bleed through the wall. So you end up having to design the whole level to accomodate the renderer to a fairly extreme degree.
This should mean you fall back to baked Shadowmasks, but these seem to have terrible performance overheads too, so the reality is you often need to fall back to baked lights with only 1-2 real time, shadow casting lights per area, and maybe 1-2 real time, non-shadow casting lights, carefully set up to cover the issues with baked, like the lack of specularity.
The final big issue is that whilst the GPU version eased the pain, Unity’s lightmapping is still awful; with a lethal combination of unpredictable, buggy, mediocre results that look nothing like the diffuse realtime render, and baffling sliders that need a lot of tuning against excruciating bake times (and when working/tuning creatively, even 10 mins is excruciating). This and related bugs like lights randomly switching off and on ignoring their mode. I’m sure there’s a complex technical reason why the beautiful realtime shadows can’t just be stuck into a lightmap, but it’s annoying they can’t (and changing them to ‘on enable’ from ‘realtime’ has little performance difference).
The conclusion I’ve reached with HDRP is if you’re making a beautiful RT render of an object, or small locale, e.g. for a portfolio/archvis/tech demo, with minimal or controlled camera movement - it’s great. If you’re expecting to make an actual game (or reasonably scaled level), where things like handling a light on the far side of a wall without it bleeding-through and need to use and manage large numbers of lights/probes/shadows, it’s very hard to stand HDRP next to Unreal and find reasons to argue in favor of HDRP.