AFAIK there is nothing like you cant call level_load from entities. You can use it every possible place.
i use this way:
the level block entity's string1 is set to next levels name(say "level2.wmb")
and i have a function like that:
function baslat(){
SOUND* wwry = "wwry.ogg";
var i;
for (i =0;i <= 5;i++) {kollar[i] = 0; }
//above are initialazition of the global variables, that needs to be set 0 on every level starts
level_load(level);//i have a STRING* level;
freeze_mode = 0;
wait(-1);
snd_stopall(4);
snd_loop(wwry,10,0);
}
and in the impact event i use
if (EVENT_TYPE == event_impact)
{
level = my.string1;
baslat();
}