You may try creating an avalon breakout component. Then you can have your custom code outside of SOPC.
Basically, the avalon breakout module pulls the avalon signals to the toplevel sopc system generated HDL code. Then you can instantiate your custom code to that. This way, you can determine the clock domain crossing method, and you do not have to rerun SOPC when you make a change to your custom code. It can be a bit more work up front but can save time on the back end. You do need to know avalon bus transactions, but its good to know this anyways.
I prefer this method with some of the more complex custom components.