In my experience, the best approach is one that includes documentation as one of the continuous activities that are always going on - just as you shouldn't leave all the bug fixes for the end of the project, neither should you leave all the documentation.
Of course, "Documentation" is a generic term that could apply to any of a dozen different artifacts - the "best" approach will depend on what is required, which in turn depends on the target audience.
Here are some thoughts ...
Developer Documentation - set up some kind of tool to harvest information from your source code. If you're a .NET shop, use SandCastle; for Java, use JavaDoc; for Delphi, Time2Help; whatever your environment, find a tool that will harvest metadata and comments from your source and compile that into a usable form. Integrate the documention into your builds - daily if possible.
Release Documentation - check out what's available from your bug tracking tool for documenting the fixes/changes/features in each release. JIRA can generate release notes based on the "fixed in" release, other systems have similar functionality.
Support Documentation - encourage your developers to make notes about things that might be an issue for production. A wiki is good, as is an email alias. Whatever system you use, keep the "barrier for entry" low so that you capture the data. Having the information is more important than having it pretty. Hire a student to collate the details together.
Tip: Make the document fault/fix focussed so your admins don't have to read the whole thing.
End User Documentation - not everyone learns well by reading, so think about other possibilities. Record a screencast using Wink, use screenshots. If you're running automated testing of the GUI for specified scenarios, capture a movie of those steps to demonstrate to end users.