Usually the compression-rate of a qvw-file is 8...10-fold if loaded into RAM. For each user you should add 10%. Thus your above observation of 60% RAM-consumption is within range.
Question is alway, how may objects are active, when opening an application (and whether there are inital filters set). You should try to minimize or restrict the objects to show only xxx number of records in order to encourage the users to filter their data.
IF-conditions are sometimes problematic, especially when nested or when lots of distinct data to be analyzed. Would start here with a critical view. Might also be possible to precalculate some of these IF's in the script already.
You may check with .mem-file the consumption of RAM for individual objects, likewise you may check the last calculation-time under sheet->properties->objects.
building on Christian's idea, try to replace IF_statements (nested IFs in particular) with PICK(MATCH()) functions. It keeps the whole thing much easier rgd. the bracketing (you open and close every line individually, so you don't have to worry much about where to close specific parts) -. and I believe it also enhances performance.
The fact that your sheets take quite a lot of time to load points to the conclusion that you probably have some pretty complex charts or resource-intensive calculations to be done on the GUI.
Can you discern whether it is more on the script_layer or on the GUI that you do have issues? Does your data load in acceptable time?
Just test it locally and see which part(s) of your application are okay and which seem to be slow.