The main issue is that you are trying to be PBR, and by that I mean you are trying to do surface lighting… when what you need is density lighting. And we don’t yet really have the perfs to do fully raytraced volume lighting…
So an old trick I am still very fond of is to use a D-Lut (Dot Look-Up Table) map. Basically, you get a small texture like 32x32 where on 1 axis you encode NdotL(biased to 0-1) and on the other axis you encode NdotV(biased to 0-1). So in one corner you have the color when direct lit, and facing, in another you have the color when facing and backlit, another corner is backface, backlit, the last corner is backface, front lit… So the middle area is your rim light… etc… You can switch around the thing is you switch axis or 1- the biased dot products but that’s the idea anyways. So its kinda like pseudo BRDF and it ends up quite ok… But while it solves translucency very decently (if you treat your alpha as a density map) it doesn’t solve the self shadow problem.
Enter the 4D shadow maps… Which are easy to generate and amazing looking and my current go to method. (Normals are terrible.)
This is an old one, but you can see below the vertex lit lighting using 4D shadow map. (Note: the transparency is boosted to show the lighting more clearly)
By combining the 2, you can get amazing result. Mostly depends what you budget is… but technically, if you skip the pseudo BRDF D-Lut map, doing the 4D Shadowmap instead of normals is cheaper in perf and looks better imho.