From what I understand about the plm package, those two approaches should be identical. 

However, the fixed effects produced from this explicit specification are shown to be "reference dependent" [i.e. relative to the default reference in your factor(index)]
 
        tfe <- plm(y ~ x1 + x2 + factor(index), data, model = "within", index = c("id", "index"))

In contrast, fixef() returns the fixed effects in levels (by default). For you to get the same fixed effect estimates, by specifying the following:

        fixef(object = tfe, effect = "individual", type = "dfirst")



The equivalent for the individual level fixed effects would be:

        fixef(object = tfe, effect = "time", type = "dfirst")