Most modern 3D game engines and GPUs can technically deal with a very high polycount. The main reason why game companies cut them down is to make games playable on lower-end systems and also consoles (once they are 3 to 4 years old, they can't keep up with a modern high-end PC) and mobile platforms. Therefore it's important to plan for the game engine and also the hardware platform you are aiming for.
One problem that remains across all platforms and all 3D game engines is that too many materials put a high load on the system. Loading and processing materials produce draw calls, therefore you want to keep them as low as possible by reducing the materials to the bare minimum for each model.
If you want to go deeper into the topic, I highly recommend to read Simon Scheibt's "Render Hell".
Modeling 3D Game Assets
If it comes to the question of "good practice" or "best practice", you possibly get more than one answer, depending on who you ask.
Reducing polycount has been the subject of controversial debate for a long time. Some people say that triangles are bad in general (even for assets that aren't animated), others tell you the complete opposite.
Personally I follow the rule "If it doesn't change the visual appearance of a model (geometry and shading), it's not necessary".
My "working model" is composed entirely of quads. Then I create a copy of it and add detail for the high-poly version. A second copy will be the final low-poly version, where I eliminate all unnecessary vertices by sliding them across the edges without changing the geometry.
Another good method to keep the polycount down without loosing too much detail is to compose assets out of several submeshes, when necessary.
While it's always nice to have a "clean topology" there are certain cases where it simply doesn't make sense, for instance if you have to add many additional loopcuts and vertices for the sake of keeping your asset as "one mesh".
One Mesh (including submeshes) and one Material per Asset
Simply put, that's the second rule I try follow, whenever possible. Big models like buildings are problematic when it comes to texture space. In this case I'm a big fan of the modular approach (as known from the Elder Scrolls since Morrowind and Fallout 3, NV and 4).
Another method of adding detail to diffuse maps without creating insanely big textures is using secondary maps or detail textures. Modern 3D game engines like Unity 5 and UE4 are capable of cross-blening a second material onto a model, when the camera comes close to it.