If you are looking for a more simpler design, then you might want to use a static mapper class for this. Here is a pseudo code which might help you solve this problem:
public static class CustomMapper
{ public static void leadToContact(Lead lead, ID contactID)
{ var contact = new Contact(contactID);
///do mapping here
///eg
///returnval.Newsletter__c = Lead.Newsletter__c;
contact.save();
}
}
Then you could convert the lead to contact prior to usage and get the resulting contact ID. You can do this by the following code:
CustomMapper.leadToContact(myOldLead, myContactID);
So, now if you perform a conversion, right after performing the custom mapping with an update, it will seem like an instant update to the users. I hope my answer was satisfactory enough.