>>712 ごめん、暇人なんでちょっと食い下がらせて。
Cygwin 環境自体は UNIX に似せてあるわけだから、テキストデータの改行コードといえば、LF ("\x0A")一文字を指す。
したがって、Cygwin 環境で動くアプリは、>>723 に書いた変換を本来行ってはいけない。
つまり、次の動作が正しい。
(1) 入力データの行末が CR LF なら
(2) それを perl で呼んだ結果の行末も CR LF でなければならず、
(3) それを出力したものの行末も CR LF でなければならない。
(誰も CR を減らしも増やしもしない)

>>716 読むと、(2) は成立してるようだが、(3) が成立していないようだ(出力時に LF --> CR LF 変換が起きている)。
したがって、>>720 が言うように、binmode STDOUT; でその変換を確実に殺してやれば解決はするんだが、
何で変換がおきるのかが謎。
実際、hello.txt の中身が "hello!\x0D\x0A" だとして、
 perl -e "print while(<>);" < hello.txt > hello2.txt
を実行すると、hello2.txt の中身は "hello!\x0D\x0A" であって、>>712 のようなことは起きない。