There are two answers here that are mostly correct with regard to how to solve this problem when using Maven when dealing with this issue. However, both are not 100% complete.
Using Exclusions per @Tom Hunter's answer
This answer works. However, there will still be log messages from Tomcat regarding duplicate TLD definitions. This is because both the jstl and jstl-impl artifacts include the TLD definitions. To remove those messages, I think a better Maven setup is this:
<dependency>
<version>1.2</version>
<scope>runtime</scope>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
<exclusion>
<artifactId>jstl-api</artifactId>
<groupId>javax.servlet.jsp.jstl</groupId>
</exclusion>
</exclusions>
</dependency>
This includes only the jstl api classes with the necessary exclusions to avoid the problems explained in the rest of that answer.
Using newer POM versions per @George's answer
It took me a while to realize it, but there are newer versions of the JSTL pom's available. It's really confusing because these newer packages use similar, but slightly different naming conventions. These newer versions mark the javax.servlet, javax.jsp, etc dependencies as provided scope so that they do not need to be excluded. The 1.2.1 version depends on a 1.2.1 version of the jstl-api. And so this would work as well as above answer:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
<scope>runtime</scope>
</dependency>
This differs slightly from George's answer because I changed scope to runtime. George specified scope as provided. With a provided scope, the jars would have to be copied manually in to the Tomcat lib directory, or some other dependency would have to included the necessary implementation.
However, I could not find the 1.2.1 version of the impl in maven central, jboss repo, or any other repos. I ended up going around in circles and finally just used a local file based repo to store the jar. The dependency and jar are described here: