As many others have said: Control-C typically sends the unix signal SIGINT and the default behavior (from programs that don't overide it) is "terminate process". The program can ignore this signal or take a different action if it desires.

You can also send SIGQUIT from the keyboard with Control-\. The difference here is that by default the process will write a core file, then quit. The program can ignore this signal or take a different action if it desires.

To terminate with extreme prejudice and without allowing the process to stop you use SIGKILL, which is not bound to any key by default. Instead you generally send it using the kill (1) command and specifying the signal to send as in
$ kill -9
or mnemonically
$ kill -KILL
This signal is handled directly by the OS and the program can not override the default behavior

If your shell supports job control it may also support a built in version of kill which supports job identification using the % character as in catwalk's answer.

To pause a process in a resume-able way you use Control-z which sends SIGTSTP. You resume such a process with either fg to continue in control of the terminal or bg to set it running without keeping control of the terminal (but, by default, still sending its output there).

It seems the other answers are the likely scenario, but it is also possible that you are executing a script that doesn't handle its children correctly. I recently hit a similar scenario, where killing a script would not kill the child processes of that script.

In general, if you get into this situation, you'll have to review all the processes that you are running. You should review the manpage for ps. (man ps) I particularly like using ps auxwf, which shows the parent/child relationship between processes. pstree does something similar. You should run this from another terminal before killing the process to see what things look like in the normal situation, and identify the child processes.

If you then kill (with ^C) that main process, check the output of ps again to see if anything has changed. If the child processes are still around, you can kill them with the kill command. (see man kill)

This is not clear to most terminal newbies, but if your issue is just that you are in an interactive program and you can't figure out how to get out, quite often q will exit. For example, this is the key to exit less, which is also the program you get when you view man pages, among other things.

Some programs have other keyboard shortcuts to exit. In vim or vi, use ESC:wq. In emacs, use Control-C Control-X. In nano or pico, use Control-X. Note that in these examples there are subtitles, in particular, concerning whether or not those shortcuts save any changes you may have made to the file you are editing.