Most Tcl scripts and commands are designed to operate over high level, expensive constructs, where speed is not the primary consideration. In these cases, the cost of the interpretation is negligible compared to the overhead within individual callback functions. For example, on a Sun Sparc2, the set command takes under 75 microseconds. By comparison, creating a new window in X Windows can take a human-noticeable amount of time, even on faster workstations. Using Tcl as a heavyweight integration tool generally does not impact application performance. Even in cases where it does, performance bottlenecks in Tcl can easily be isolated and rewritten in C, in the form of callbacks.
However, this recoding is annoying and inbihits the configurability that Tcl offers; it can also remove some of the modularity of a well-written Tcl-based program. For example, if you discover that a loop written in Tcl is a performance bottleneck, it would be rewritten in C, and a new command registered with the Tcl interpreter. Once this has been done, any commands in the loop are now hard-coded relative to the high degree of configurability that Tcl offers.