We got a request to modify the page that opens when you want to add a partner for an Opportunity.

Sounds like an easy task to start with. However it turns out to be a bit difficult.
The page is a standard page built into the application and can not be changed. The obvious option would then be to create your own Visualforce page instead and override the New button on the Opportunity related list for Partner to point to this Visualforce page instead. However that is not possible either. You can not override the button nor delete it or or create any new buttons.
We came up with two options. None of them has been implemented at this stage.
#1 Create a custom object- Create a custom object to use instead of the OpportunityPartner object.
- Remove the related lists for Partner from the Account- and the Opportunity page layouts.
- Create a VisualForce page to represent the new Partner Edit page.
- Create new related lists for the custom object and add to the page layout for this object.
- Add New buttons to the related lists and tie it to the new VisualForce-page.
- Run a data loader job to copy data from the existing OpportunityPartner objects to the new custom object.
- Think twice before deleting any OpportunityPartner or Partner objects. We tried that once and deleted lots of Opportunities.
- Create new reports and remove old reports
- Other dependencies in Apex classes or integrations?
#2 Keep the OpportunityPartner object- Remove the related lists on the page layouts for the Account and the Opportunity
- Create a VisualForce page to represent the new Partner Edit page.
- Create a button on the Opportunity detail which is tied to this VisualForce-page.
- Create another VisualForce page that should simulate the Opportunity Partner/Partner related list.
- Add this VisualForce-page as inline VisualForce to the Opportunity detail.
- Since the OpportunityPartner object is only queryable and retrievable there might be a problem with the Visualforce Page simulating the Partner Edit page. In this case the Partner object could be used instead as the standard controller since a creation of either of the objects creates an instance of the other.
Option #1 is more clean and future safe. However it is more expensive in terms of time and also contains more risk of missing something.
Option #2 works good enough and is not as expensive. Doesn't feel too good to move away from standard behaviour on a standard object though and it is not as future safe.