There's actual research on this subject. It's old, but very relevant to the question at hand.
The paper, from 2000, is called "When the CRC and TCP checksum disagree" by Jonathan Stone and Craig Partridge, which investigate packet and frame errors, and look how often the TCP checksum is wrong, but the Ethernet CRC is fine. You can find the PDF here. Here are the important bits. 
From the abstract:
Traces of Internet packets from the past two years show that between 1
  packet in 1,100 and 1 packet in 32,000 fails the TCP checksum, even on
  links where link-level CRCs should catch all but 1 in 4 billion
  errors.
From the conclusion (with some of my highlighting)
In practice, the checksum is being asked to detect an error every
  few thousand packets. After eliminating those errors that the checksum
  always catches, the data suggests that, on average, between one packet
  in 10 billion and one packet in a few millions will have an error that
  goes undetected. The exact range depends on the type of data
  transferred and the path being traversed. While these odds seem large,
  they do not encourage complacency. In every trace, one or two 'bad
  apple' hosts or paths are responsible for a huge proportion of the
  errors. For applications which stumble across one of the `bad-apple'
  hosts, the expected time until a corrupted data is accepted could be
  as low as a few minutes. When compared to undetected error rates for
  local I/O (e.g., disk drives), these rates are disturbing. Our
  conclusion is that vital applications should strongly consider
  augmenting the TCP checksum with an application sum.
I don't know of any newer research into that question (enlighten me if you know otherwise!), so the Internet could have become more reliable since then, and the numbers in the paper might be irrelevant.
However, and this is important, 17 years have passed, and the amount of Internet traffic simply exploded since that paper was written. At 1Gbps, which is not an uncommon connection speed nowadays, you're sending about 81K full TCP segments, with 1460 bytes of data, per second (or a lot more if the packets are smaller). That's a million big packets every 12.5 seconds, a billion in about 3.5 hours (or again, a lot more if the packets are small). 
So to answer your question - that depends.
For transferring large files or other data, I'd definitely add additional checks if the data itself isn't protected in any way. For messaging, which pushes very little data into the network, you'll probably be fine with TCP's checksum, with maybe some sanity checks on the input you're getting to make sure that it's in the correct format, and various parameters and fields make sense.