I'm not so sure, although tightly integrating things is generally looked down upon, having everything know that there is a script system and exactly how to use it is opens up so many possibilities. If you abstract that away, the scripting suddenly becomes far less powerful.
Take this as an example. Before *anything* is done in my app, I init the scripting system. I then load my base configuration file, which is a simple python script, but just things like:
GameName = "MyGame"
GameVersion = "0.4"
EngineClass = "MyTestGameEngine"
# etc...
It looks like a normal configuration script, although I could define functions, import other scripts/configurations, etc... The EngineClass is then looked for in the script system as a class name, in this case MyTestGameEngine is a C++ class derived from EngineBase, both of which are exposed to Python. The engine could just have easily been a python script, which for a real-time game you probably would not want to do, or at least only very little of. The engine then inits all graphics, its resource system (Ogre in this case), sets up networking, etc... and launches the beginning level. The Engine also has a configuration script along the lines of:
class MyTestGameEngine(_MyTestGameEngine):
PlayerClass = "MyPlayerClass"
IntroLevel = "MainMenu"
ModuleDirectories = ["../Modules/Base", "../Modules/Levels", "../Modules/whatever"]
# etc...
The engine could just as well be headless for like a dedicated server, probably a subclass of the graphical version that just does not start the graphics. If wanted, the engine could just as easily be a web server that hosts a little html game...
This engine then launches the IntroLevel, which is the MainMenu (which is still a level), and proceeds and so forth.
Just by changing the first scripts name to a different Engine, I could have a completely different program.
By changing the Engine's intro map, maybe under a new configuration class name that would be called something like MyTestGameEngineMenuMod, then I'd have a different main menu, which could setup an entirely different type of play. By adding a listing of something like "../mods/myMod" to the ModuleDirectories variable, then I could play my own mod of a game. I can alter that variable during gameplay from within the game, like a module manager to enable disable module directories, or individual modules, or whatnot.
My exe is also setup so it calls a configuration script of the same name, so if someone wanted their own mod off of, but not inside of this, they'd just have to make a new base configuration script, and copy the exe and rename to the same name as the configuration script, but as .exe and not .cfg... You can also pass it as a /cfg <configurationFilename> to the exe as well...
You can see where I am going from here...