From the business perspective, you might have none, some or all of the above options available, e.g. if your contract says "by date X or you get no money", than you can only try adding resources or cutting requirements. Since you're close to project completion, adding more resources might be counter-productive.
Contract constraints aside, if you want to limit the scope, you should identify dependencies between features and have them prioritized by the user. It should go without saying that you do nothing unilaterally: whatever you do, make sure the customer is on board, even if he/she/they are not pleased by the situation (which is likely to be the case).
Delaying the delivery date is what happens most of the time: the best you can do is to react as soon as possible and keep the customer's expectations realistic. While this is painful, the customer is likely to appreciate the fact that he/she/they can adapt their own plans and avoid damage propagation (cancel or delay marketing plans etc.).
Estimates deserve to be mentioned separately. Estimates should have been available at every stage of the project. If you are not going to be on time, it is because you've spent more time than planned on completed tasks, because you feel the remaining tasks are more complex than anticipated or both. Update your estimates and let the customer know: use them to support your new proposed deadline. Including free support or an unplanned feature or two to make up for the delay might be easier to bear than transferring money, if the option is available.
It's a big subject: this just skims it.