Is this common practice? Why is this actually done? For performance?
Yes. People who do it are generally trying to reuse existing software (which you'll have noticed is written in multiple languages) or are trying to use several different languages, each one what it's good for.
Performance may sometimes be related; for example, I may want to use Lua for its rapid-prototyping abilities but connect it to a highly performant email parser written in C.
I think that you will have problems with the different interpreters/compilers and seamlessly connecting the different languages. Is this true?
Sometimes. The state of practice in multi-language is roughly that if a language will talk to anything other than itself, it will talk to C. So it's often possible to get things to work together through some sort of C-like interface.
Otherwise, the first problems typically surface either in memory management or in a VM layer, which we might consider examples of "managed code". It's very hard to get a Haskell program to exchange heap-allocated objects with a JVM, for example. A typically workaround is to treat these kinds of calls like remote procedure calls, just as if the programs were running in different processes or even on different machines. Such calls can involve substantial overhead, often making it prohibitively expensive for two different languages to share mutable objects, for example. If you don't have to mutate things, however, the overheads aren't so bad.
Summary: there are sound reasons to use different languages to solve different problems, and it would be surprising if a large software system did not use multiple languages (except maybe in single-language silos like Squeak Smalltalk, which simply don't talk to the rest of the world). There are certainly difficulties with interoperability, but the problem is an old one and workarounds are known.