If I were to convert all of my GUI code to custom script, then go through it all and replace all the BJs with natives, what would be the efficiency gain?
Hardly noticeable I would guess.
It's only important for actions that run often (periodic trigger + unit group/loop).
If you want to have more efficient triggers, you should definitely use JASS instead of GUI, but you also need to use the advantages of JASS. That requires a lot of work though, because you will have to change quite a lot.
If you only want to avoid BJs then it's not worth it.
Let's assume you have a trigger that has 10 actions in GUI. Converting it will result in 10 BJs. If these are BJs, that only call one native, you would have only 50% of the function calls.
I would assume that a simple function call of a BJ, that only calls a native is a lot faster than the native itself.
So if you have KillUnitBJ and KillUnit (I don't know if KillUnitBJ exists, but that's just to explain):
KillUnit: takes a certain time: T1
KillUnitBj: takes the time of KillUnit plus time to call KillUnit: T1 + T2
In this case T1 >> T2, because for killing a unit the game has to do a lot more things than for calling a function
So KillUnit is by no means twice as fast as KillUnitBJ just because it's half the amount of function calls.
Another thing to keep in mind is, that a lot of BJs call multiple natives, so the realtive time the BJ takes longer than all the natives is even lower.
Sections that run very often are worth it to be changed, but apart from that I doubt it's necessary. In general you should rather try to find more efficient algorithms to solve your problems.
For example avoiding "count units in unit group" by keeping track of the number of units in a group.