Updates or creates an entity based on if a value is present in an Optional
Regarding your questions

Is this an inappropriate use of Optional's map method? I'm not mapping
to a new object but rather just returning the same car with some
properties potentially updated.

I think it's appropriate because it might return an updated object. Unfortunately (as you said) Java 8 doesn't have ifPresentOrElse.

The save method is really only required to be called for cars created
in the orElseGet.

You can change the orElseGet with orElseGet(() -&gt; mySpringCarRepo.save(createCar(carInfo))) and remove the final save to the db.
Performances
The complexity of the method is O(c*ci) where c is the number of cars in your DB and ci is the number of CarInfo.
If you store the Cars in a Map instead of a Set you can improve it to O(ci).
void saveCars() {
    // get CarInfo from a webservice
    List&lt;CarInfo&gt; carInfos = getCarInfo();
    // Get cars from DB that correspond to each CarInfo
    Map&lt;Long,Car&gt; cars = mySpringCarRepo
            .findByCarInfoIdIn( getCarInfoIds(carInfos) )
            .stream()
            .collect( Collectors.toMap(Car::getCarInfoId,Function.identity()));
    
    for (CarInfo carInfo : carInfos) {
        // Returns Optional&lt;Car&gt;
        Optional.ofNullable(cars.get(carInfo.getId()))
        // Update car if already exists
        .map(c -&gt; updateCar(carInfo, c))
        // Save car otherwise
        .orElseGet(() -&gt; mySpringCarRepo.save(createCar(carInfo)));
    }
}

Or if you don't mind to query the db for each CarInfo, than the method is shorter:
void saveCars() {
    getCarInfo().stream()
        .forEach(carInfo -&gt; 
                    // returns Optional&lt;Car&gt;
                    mySpringCarRepo.findByCarInfoId(carInfo.getId()) 
                    // Update car if already exists
                    .map(car -&gt; updateCar(carInfo, car))
                    // Save car otherwise
                    .orElseGet(() -&gt; mySpringCarRepo.save(createCar(carInfo))));
}

Note 1: I haven't fully tested the code, it's just to give you an idea how to improve it.
Note 2: the performance gain might be irrelevant due to the DB and network latency, but with the second approach you should save some memory space.
Naming
The method name saveCars is not very appropriate, a better name might be updateCars or syncCars.