I once learned that the "Die()" commant can fail if the creature dies too fast, i.e. if the script block doesn't run in exact that moment. So, putting them on top of the file would be good, I think. Later someone said it isn't quite as that so I am confused. Did you test it several times in a row?
To be sure and safe, the two checks could be added to the area script, instead, with Dead() check (instead of Die(), obviously).
The variable handling is the same in BGII, variable =0 works if the variable wasn't set yet.
Also: I notice in the posted script blocks, that the checking variable doesn't get set? The blocks loop that way. If Prism is hostile, the Die() block never gets executed (intheory, it doesn't have to, but looping script blocks are never good). If the "abgf_GemInEye" variable is needed elsewhere, a variable should be added to the block(s), especially if putting them on top of the file.
The looping shouldn't have prevented the emptying of the eyes, though.
Another question: If one gem is pick-pocketed, shouldn't also one gem of the eyes be destroyed instantly? Can't recall whether this is covered, just a thought because you wrote that the gems in the eyes are still there after one was stolen from Prism?