First of all you need to understand that optimization is divided into two types which are CPU and GPU optimization. Both GPU and CPU needs to communicate well to each other to maintain the performance. In short, there is no strict or fixed solution to optimize your game. That’s why we have game profiler, to analyze the elements that cost the frame rate.
Since you have mentioned about nanite and the noticeable performance drop when you start placing the foliage, my best guess is that you are using the nanite function in a wrong way. Up until now, nanite hates masked or transparency materials. This is a common mistake for artists to make. Can you confirm this for start?