You can find exact problem areas by replacing code or assets types with versions that use no compute or memory bandwidth resources. A large performance difference indicates a problem area.
The following procedure explains how to find problem shaders:
Replace all shaders with null shaders and measure the performance difference. If there is not much performance difference then the problem is not a shader. If there is a big difference then there is a problem with shaders.
Divide the shaders into two halves, A and B, and test again.
test with the A half as null shaders and the B half as the original shaders
test with the A half as the original shaders and the B half as null shaders
compare the results.
Determine the half with the largest performance impact. Divide this half into two and repeat step 2. Continue this process until you have located the problem shader.
Optimize the shader and measure performance again with all the original shaders present. If there is still a problem there might be other problems shaders. Continue repeating the process until you have optimized all the problem shaders.
It is important to be systematic in this process. Investigate one type of code or asset at a time. If you try investigating more than one type at a time your measurements are likely to be inaccurate.