I tried to set up StatusCode of the Response but everytime I got exception: Server cannot set status after HTTP headers have been sent. I attached part of my code, I tried various solutions to fix this but without success. Thank you for your help.
public class Custom404Page : Sitecore.Pipelines.HttpRequest.ExecuteRequest
{
    protected override void RedirectOnItemNotFound(string url)
    {
        try
        {
            SiteContext siteContext = Context.Site;
            Database database = Context.Database;
            RedirectTo404Page(siteContext, database);
        }
        catch (Exception ex)
        {
            LogManager.LogError(string.Format("Custom404Page throws exception. Redirection from {0} to custom 404 page failed.", url), ex);
        }
    }
    public void RedirectTo404Page(SiteContext siteContext, Database database)
    {
        try
        {
            if (String.IsNullOrEmpty(siteContext.StartPath))
            {
                return;
            }
            var startPage = database.GetItem(siteContext.StartPath);
            var paths = startPage.Paths;
            var parentPath = paths.ParentPath;
            var templateId = Page404Item.TemplateId;
            Item page404Item = database.SelectSingleItem("fast:/" + parentPath + "//*[@@templateid = '" + templateId + "']");
            if (page404Item != null)
            {
                if (page404Item.Versions.Count == 0)
                {
                    Language contentLanguage;
                    if (Language.TryParse(siteContext.Language, out contentLanguage))
                    {
                        Context.Language = contentLanguage;
                        page404Item = page404Item.Database.GetItem(page404Item.ID);
                    }
                }
                if (0 < page404Item.Versions.Count)
                {
                    string page404Url = GetUrlFromPage404Item(page404Item);
                    if (!string.IsNullOrEmpty(page404Url))
                    {
                        var context = HttpContext.Current;
                        context.Response.Clear();
                        context.Server.ClearError();
                        context.Response.BufferOutput = true;
                        context.Response.TrySkipIisCustomErrors = true;
                        context.Response.StatusCode = (int)HttpStatusCode.NotFound;
                        string html404Page = WebUtil.ExecuteWebPage(page404Url);
                        context.Response.Write(html404Page);
                        context.Response.Flush();
                        context.Response.SuppressContent = true;
                        context.ApplicationInstance.CompleteRequest();
                    }
                }
            }
        }
        catch (ThreadAbortException ex)
        {
        }
        catch (WebException ex)
        {
            LogManager.LogError(string.Format("Page404Provider throws WebException."), ex);
        }
        catch (Exception ex)
        {
            LogManager.LogError(string.Format("Page404Provider throws exception."), ex);
        }
    }
    private string GetUrlFromPage404Item(Item page404Item)
    {
        string url = string.Empty;
        Page404Item data = (Page404Item)page404Item;
        if (data.LinkTo404Page != null)
        {
            url = ItemUtility.CreateItemUrl(data.LinkTo404Page.Item, true);
        }
        return url;
    }
}
 
    