I'm afraid this is not a bug but expected behaviour. You pass an argument to throw command which is a result of the function call. With any other command the compiler will behave in the same way, it will first call the function to obtain return value and only then use the value as the argument for the command.
You probably did not expect the function to be executed at all, but there is no reason why it shouldn't, it is inside try {} scope that has been entered. In other cases when you have throw inside then {} scope, it is different because then {} scope is only entered when "if" before that evaluates to true. And since it is false in your example it never has a chance.
Compare this to getVariable with devault value. Same thing would happen, if default value is a function call, it will first call the function.
a = 10;
b = missionNamespace getVariable ["a", 123 call abc];
the abc function will always run, regardless if a is or isn't defined. I hope this clears it up and sorry for the time you have wasted on changing.