Rewriting the code without use of GOTO This is a code automatically converted from VB 6.0 to C#.net
What is a safe and correct way to get rid of that GOTO statement?

public bool IsDirty(bool checkChildrenInd)
{
    bool result = false;
    //Determine if this object is 'dirty', or has been updated since it was created.

    if (Parent.NewInd)
    {
        return true;
    }

    if (backup == null)
    {
        goto CheckChildren; //Check any child lists
    }

    if (!String.Equals(MissingDataValue, backup.MissingDataValue))
    {
        return true;
    }

    if (!String.Equals(PreviewDataValue, backup.PreviewDataValue))
    {
        return true;
    }

    if (FieldOption != backup.FieldOption)
    {
        return true;
    }

CheckChildren:
    if (!checkChildrenInd)
    {
        return result;
    }
    return result;
}
EDIT: FIXED

This specific instance can be rewritten as

public bool IsDirty(bool checkChildrenInd) {
  return ! (  Parent.NewId ||
              backup == null ||
              String.Equals(MissingDataValue, backup.MissingDataValue) ||
              String.Equals(PreviewDataValue, backup.PreviewDataValue) ||
              FieldOption == backup.FieldOption );
}


if this pattern is always the same, but there may be other conditions as you note in the comments, I note that CheckChildren 


Takes a parameter which is also the function parameter
returns on all code paths
result is never assigned to before the goto statement


If this is always true, you can factor it out. replace the CheckChildren label with a function:

private bool CheckChildren(bool checkChildrenInd){
    bool result = false;
    if (!checkChildrenInd)
    {
        return result;
    }
    return result;
}


and the goto CheckChildren; with return CheckChildren(checkChildrenInd);

if result is possibly set to true before the goto statement, you will need to pass result as a variable to the funcion too (and include it in the signature).