In kicad up until version 5 one can add an alias to an existing symbol. Such an alias naturally has a different name and therefor value field than the original symbol. Additionally one can also asign a different documentation file as well as have differing description and keywords.
Aliases can however not differ in anything else compared to the main symbol. Meaning all fields (including the footprint field) are taken from the parent symbol.
To you this means that if you want to have BOM information as fields in the symbol then you will need a separate symbol for every such part. If you however are satisifed with just the value field differing (for example by having it equal to the part number) then you can use aliases for parts in the same package (so every 0603 resistor can in this case share a single symbol definition and only differs in the value)
I personally use a slighly different approach. I do not encode the part number in the schematic at all but use a so called house part number. That house part number is a combination of the resistor value, tolerance and size. I therefore have a symbol per resitor size and tolerance with the house part number pre filled with the identifiers of these two parameters. I then just need a script that adds the value field to the partial house part number and then use an external tool (spreadsheet) to link to a real orderable part. This allows me to quickly exchange parts with equivalent options if a given part is not available all without touching the design files (was very useful during the MLCC crisis)
Of course the value field is then filled out during design time (so if i want to have a 1K resistor with 1% tolerance and in 0603 size then i choose the R_1percent_0603 symbol and fill the value field with 1k00 after placing it down)
Another benefit of my workflow is that if i discover i don’t need a 1k here but a 2.2k then i just need to change the value field and nothing else is changed.