Reduce the number of calls to drawing functions, grouping everything that has the same texture in one vertex/index buffer is one way to do it.
Organize the drawing order in a way you draw the close object first.(that way you will reduce the number of times you alter a pixel)
Limit the number of faces drawed, these one depends alot on your app.
Those are the main stuff you can do, of course there are a lot of more things you can do that I don't remember right now.
Coding both efficent and optimized on the GPU and CPU side. Arranging memory acces and waitstates.
And as such1 said, Organizing materials, rendercalls and more.
This is probably the hardest thing to just tell you "how to do", it´s more of an experiance thing. you just know how to optimize at the current situation!
But try to read some GPU architecture and some CPU architecture, those two things helps alot to understand how to optimize in a good & efficent way.
And remember to not optimze everything, only where it´s needed.
"There will be major features. none to be thought of yet"