In both c++ and blueprints you can make use of soft object / class pointers.
These will not load a class into memory unless you tell it to.
The thing with blueprints is that any other pointer, I think even disconnected nodes, will count as a “hard reference / dependency” which will be loaded into memory even if the node is never used.
Not unless you have a static property, loading / unloading should be dynamic in all cases afaik. Here is more info on memory management for UObjects:
No. Link I posted has some information about the classes (UClass, CDO) logically they would be loaded once to serve as a template for any object instances such as actors you spawn in a level. Any new actor instance you spawn from such class does take up new memory.
*Edit
Casting does not lead to performance issues. If you are worried about this the unoptimized engine’s source code will make the eyes bleed. Often when you need to retrieve some value from engine source your request will be passed through a ton of classes. You can of course implement your own interfaces where desired, but it is not bad to cast. It is very common to cast Actor classes to pawns, controllers to playercontrollers etc, even on tick. If you do have to cast a lot in your own code it might point at a code design flaw though. Often you can move the related code to the class you cast to, or split functionality up into smaller classes.