One mistake is that the find|du is going to add up duplicate results, eg with a directory structure foo/bar/baz it will effectively do 'du -chx foo foo/bar foo/bar/baz'. That's counting the foo/bar/baz dir 3 times. However, this would miscount on the high side, so doesn't explain what you see.
A second issue is the number of arguments you're passing to du. In the find case, you'll have thousands of arguments, and xargs will process them in chunks. You're actually not seeing the total of all the files, but the subtotal for a chunk of them. There would have been several other subtotals printed along the way. Read the man page for xargs, particularly -n (max args) and -s (max length of command line)
The normal thing to do here is not to rely on sums for a single invocation of 'du' but do the sums in another command in your pipeline. However, once you try this, you'll hit the first problem I mentioned - you're counting directories multiple times.