You're right, I don't trust GenericOperationCommand either 
I have actually rewritten the LoadModuleOperation class to make it implement the IAsyncCommand interface.
It looks like this :
Code:
…
public class LoadModuleOperation extends AbstractProgressOperation implements IAsyncCommand {
protected var moduleInfo:IModuleInfo;
private var applicationDomain:ApplicationDomain;
private var securityDomain:SecurityDomain;
private var moduleFactory:IFlexModuleFactory;
public function LoadModuleOperation(moduleURL:String, applicationDomain:ApplicationDomain=null, securityDomain:SecurityDomain=null, moduleFactory:IFlexModuleFactory=null) {
Assert.hasText(moduleURL, "The moduleURL argument must not be null or empty");
super();
init(moduleURL, applicationDomain, securityDomain, moduleFactory);
}
protected function init(moduleURL:String, applicationDomain:ApplicationDomain, securityDomain:SecurityDomain, moduleFactory:IFlexModuleFactory):void {
this.applicationDomain = applicationDomain;
this.securityDomain = securityDomain;
this.moduleFactory = moduleFactory;
moduleInfo = ModuleManager.getModule(moduleURL);
moduleInfo.addEventListener(ModuleEvent.READY, readyHandler, false, 0, true);
moduleInfo.addEventListener(ModuleEvent.ERROR, errorHandler, false, 0, true);
moduleInfo.addEventListener(ModuleEvent.PROGRESS, progressHandler, false, 0, true);
}
public function execute():* {
moduleInfo.load(applicationDomain, securityDomain, null, moduleFactory);
}
…
Of course, now I have to call the execute() method to actually run the operation 
But at least I'm sure the listeners are triggered whatever the behaviour of the underlying implementation.