Two possibilities occur to me:
1. Cufflinks attempts to correct for sequence bias and other effects, while the simple BED region read counting will not.
A very rough example is something like:
Gene read count = Gene length * (FPKM + f(GC content) + g(sequence) + ...)
The gene read count (from BEDtools) includes many observed effects, including the "true" expression value (estimated by Cufflinks). When you compare Gene read count / Gene length to FPKM, the correlation is made worse due to the noise from the extra terms.
2. I'd also be concerned about your procedure to divide "by the sum of all the exon lengths." Unless you are doing a lot more than you say, this will never be exactly correct. Cufflinks is estimating the exon usage pattern and will report FPKMs based on its solution to that optimization problem.
Consider this example: three exons of 1000 bp each, but one exon is rarely or never used. Cufflinks verifies this from your data and normalizes by 2000 bp (two exons used). Your BEDtools script sees all the exons, doesn't check if they're used or not, and normalizes by 3000 bp. This makes the BEDtools number underestimate the true value (and Cufflinks's estimate), which your plot does seem to suggest.
when you do the bedtools analysis, what is the input alignment file?
@Istvan Albert: I use the -abam flag to provide the accepted_hits.bam file from the tophat output