Here are some quick answers based on memory. (For more information, you can contact the compiler for help.)
1) It allows you to configure different frameworks without trying to implicitly use any mscorlib / FSharp.Core assemblies. This way you use this when, for example, you explicitly reference Silverlight mscorlib / FSharp.Core for the target Silverlight.
2) Yes, almost all of them, and I do not know what it is. You can look at opt.fs.
3) Debugging - when using VS in the "Debugging" --tailcalls- , --tailcalls- is transmitted to disable tailcalls and save all frames of the stack to simplify debugging.
4) FSharp can perform embedding and other optimizations at assembly boundaries. This can be dangerous for published libraries, because if A links B and A were compiled using crossoptimize and then deployed and then someone changes / redeploys B, perhaps A will “call” the method in the “old” B because it is the code from B that was inserted into and therefore A still has the code of the “old B” if A is not recompiled. This is rarely the case in practice, but a “typical” scenario, if you have several dependent, but independently distributed F # libraries, you want to disable crossoptimize to get rid of fragile dependencies.
5) It no longer exists.
source share