You can create a base version (for GE accounts or those accounts that don't want/need to use campaigns), and an extension version (for all other accounts that do want/need to use campaigns). The base package can detect the presence of the extension package, and if present, call the additional code to leverage campaigns.
You could also dynamically check for the presence of campaigns, and the field they would optionally be using.
Map<String, SObjectType> g = Schema.getGlobalDescribe();
if(g.containsKey('Campaign') && g.get('MYNS__MyObj__c').getDescribe().fields.getMap().containsKey('Campaign__c')) {
....
Technically, using an extension package is cleaner, and less prone to problems, but requires more initial setup work. Also, using an extension package means you can guarantee the name of the field, because it can be included as part of the extension package, reducing the odds that you'll conflict with a custom field they may want to make for another purpose.