X-Drupal-Cache header not always appearing on page
The behavior you're seeing is the result of having a browser cache. After the first request, your browser caches the document and keeps track of its  signature through the Etag/Last-Modified headers.

Upon subsequent requests, the browser makes a request to the server with the If-None-Match/ If-Modified-Since headers. If the document hasn't changed, the server returns a HTTP 304 Not Modified which tells the browser it's okay to serve its cached version of the page.

Because cURL doesn't have a caching mechanism, X-Drupal-Cache always appears; it needs to go directly to Drupal each time for the document.