Okay, I figured out what was going on. As I suspected, it turned out to be Apache directives.
When I made the server switch, I used the PHP-Mysql RPM instead of building from source. The RPM, it turns out, installs a certain file, /etc/httpd/conf.d/php.conf, that holds Apache configuration directives for PHP. I wasn't aware this file existed until I happened upon it accidentally.
The file's contents were thus:
AddType application/x-httpd-php .php
LoadModule php4_module modules/libphp4.so
#
# Cause the PHP interpreter handle files with a .php extension.
#
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 524288
</Files>
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
The Apache directives enclosed in the <Files/> chunk were corrupting my POST data -- most specifically the SetInputFilter directive. I did a search for this type of thing online with my newfound knowledge, and immediately found this related thread, where the problem is described by someone else, much more lucidly than I mustered here:
http://bugs.php.net/bug.php?id=19263
I missed it before due to different wording. 🙁 Thanks for everyone's help -- I truly appreciate it.
-Jeremy
P.S. For the benefit of future searchers, here's a batch of nice terms: garbled, garbles, corrupted, corrupts, mangled, mangles, mixes, mixed, messed, screws, screwed, post, data, files, bytes, form, page, textarea, PHP, Apache 2, submit, value, HTML. 😉