The 404 page won't "kick in" when you send a 404 header from a PHP script.
You have to INCLUDE() the error page HTML content for people to see.
Without the HEADER directive sending the 404 response, the status as seen in the response would be 200 OK because the request has already been fulfilled by an internal file.
You need to use the Live HTTP Headers for Firefox extension to check the responses, not rely on the server logs. They only report Apache generated status codes, not those from within any PHP scripts.